#ifndef __UPGRADE_H__
#define __UPGRADE_H__

/** 存储介质的类型 */
typedef enum {
	MEDIA_TYPE_IS_DRAM = 0,
	MEDIA_TYPE_IS_SD,
	MEDIA_TYPE_IS_EMMC,
	MEDIA_TYPE_IS_SPI_FLASH,
	MEDIA_TYPE_IS_QSPI_FLASH,
    MEDIA_TYPE_IS_NAND_FLASH,
	MEDIA_TYPE_IS_UNKOWN,
} upgrade_media_type_en;

/** 镜像类型 */
typedef enum {
	IMAGE_TYPE_IS_UBOOT = 0,	///< u-boot image
	IMAGE_TYPE_IS_DTB,		///< 设备树
	IMAGE_TYPE_IS_KERNEL,	///< 内核
	IMAGE_TYPE_IS_ROOTFS,	///< 文件系统
	IMAGE_TYPE_IS_ALL,		///< 整体打包的镜像
	IMAGE_TYPE_IS_UNKOWN,
} upgrade_image_type_en;

/** 升级的内容 */
typedef struct upgrade_context {
    upgrade_media_type_en media_type;
    upgrade_image_type_en image_type;
    char *image_name;
    int image_size;
    char *image_mem_addr; ///< 镜像加载到内粗的地址
} upgrade_context_st;

typedef struct mmc_part_info
{
	/** 启动分区 */
	int default_boot_part;
	int boot_part_num0;	///< 需要注意的是 eMMC 的 bootloader 分区有两个，分别为 0 和 1, 这里与 SD 卡不同
	int boot_part_num1;
	int boot_sector_start;
	int boot_sector_offset;

	/** boot 分区存放 linux 镜像和设备树 */
	int linux_part_num;
	int linux_sector_start;
    int linux_sector_offset;

	/** 文件系统 */
	int rootfs_part_num;
	int rootfs_sector_start;
    int rootfs_sector_offset;
} mmc_part_info_st;

typedef struct mmc_context {
    int devnum;
    u64 mmc_size;
    mmc_part_info_st part_info;
} mmc_context_st;

#endif